home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
dskut
/
2m21src.zip
/
2MF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-31
|
33KB
|
939 lines
/*───────────────────────────────────────────────────────────────────\
│ │
│ █████ █ █ █▀▀▀▀ │
│ █ ██ ██ █ │
│ █████ █ █ █ █▀▀ │
│ █ █ █ █ │
│ █████ █ █ █ │
│ │
│ 2MF.C 2.1 - UTILIDAD DE FORMATEO DE DISQUETES 2M │
│ │
│ (c) 1994 Ciriaco García de Celis. │
│ │
│ - Para Borland C++ 2.0 ó superior en modelo de memoria LARGE. │
│ - Este programa se compila abriendo un proyecto e introduciendo │
│ en él 2MF.C, 2MFKIT.OBJ, 2MFBOTHD.OBJ y 2MFBOTDD.OBJ │
│ │
│ - NOTA: Las funciones de bajo nivel que acceden directamente a │
│ la controladora de disquetes no son indispensables, tan │
│ sólo se emplean para producir menos ruido al detectar │
│ la introducción de un nuevo disquete en la unidad. │
│ │
\───────────────────────────────────────────────────────────────────*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>
#include <bios.h>
#include <time.h>
#include <alloc.h>
unsigned _stklen=16384;
#define MAXSECT 46 /* máximo número de sectores por pista */
#define MAXFAT 6128 /* mayor FAT de 12 bits posible */
#define FD_DATA 0x3F5 /* registro de datos del 765 */
#define FD_STATUS 0x3F4 /* registro principal de estado del 765 */
#define FD_DOR 0x3F2 /* registro de salida digital */
#define FD_DIR 0x3F7 /* registro de entrada digital (RD) */
#define FD_DCR 0x3F7 /* registro de control del disquete (WR) */
struct boot { /* sector arranque disquetes 2M */
unsigned char Salto[3], IdSis[8];
short BytesSect;
char SectCluster;
short SectReserv;
char NumFats;
short FichRaiz, NumSect;
char MediaId;
short SectFat, SectPista, Caras;
long Especiales, Sect32;
char Unidad, Reservado, Flag;
long NumSerie;
char Titulo[11], TipoFat[8];
char NoUsado;
char CheckSum;
char VersionFmt, FlagWr, VelPista0, VelPistaX;
short OffsetJmp, OffsetPista0, OffsetPistaX, OffsetListaTam;
char Resto[512-76];
};
struct parametros { /* parámetros en línea de comandos */
int Unidad, HD, ED, TipoFmt, NoVerify, MarcaPoco,
Pistas, FichRaiz, Silencioso, NoPausa, X, Y, G;
};
int HablaSp(), Hay2m(), Hay2mBoot(), FormatearDisco(), MarcaFat(),
TipoDrive(), InicializaDisco(), EsperarCambioDisco(), infdc();
void Ayuda(), ProcesarParametros(), CrearSector0(),
DiagnosticoError(), InformeError(), InformeDisco(),
SonidoSube(), SonidoBaja(), SonidoError(), SonidoOn(),
SonidoOff(), Sonido(), posicionar(), outfdc(), EsperarInt();
extern BootHDPrg, BootHDPrgLong, BootDDPrg, BootDDPrgLong,
Boot2mCode, Boot2mLong, biosdsk();
extern void PicoRetardo();
int sp; /* 1-español 0-inglés */
unsigned char far *fat; /* para contener toda la FAT */
unsigned char far *buffer; /* para contener toda una pista */
unsigned long far *cbios=MK_FP(0x40, 0x6C); /* reloj del sistema */
unsigned char far *irq6=MK_FP(0x40, 0x3E); /* flag BIOS de IRQ6 */
void main (int argc, char **argv)
{
struct boot sector0;
struct parametros cmd;
int salir, result, sg;
long bytes_err, dir;
sp=HablaSp(); /* determinar idioma del país */
ProcesarParametros (argc, argv, &cmd);
if (!Hay2m())
if (!Hay2mBoot()) {
if (sp)
printf(" 2M ó 2MX 2.1 no está instalado, imposible formatear.\n");
else
printf(" 2M or 2MX 2.1 is not installed, impossible to format.\n");
exit(128);
}
else {
if (sp)
printf(" Modo SuperBOOT: instale 2M para dar formato.\n");
else
printf(" SuperBOOT mode: needed to install 2M to format.\n");
exit(127);
}
if (((fat=farmalloc( (unsigned long) MAXFAT))==NULL) ||
((buffer=farmalloc( (unsigned long) MAXSECT<<10))==NULL)) {
if (sp) printf(" Memoria insuficiente.\n");
else printf(" Insufficient memory.\n");
exit(126);
}
/* Definir el buffer para que no cruce una frontera de DMA */
dir = ((unsigned long) FP_SEG(buffer) <<4) + FP_OFF(buffer);
if ((dir >> 16) != ((dir + ((unsigned long) MAXSECT << 9)) >> 16))
buffer+=(unsigned long) MAXSECT << 9;
if (!cmd.NoPausa) {
if (sp)
printf(" Pulsa una tecla para formatear en");
else
printf(" Press any key to format on");
printf(" %c:", cmd.Unidad+'A');
salir=getch()==27;
}
else
salir=0;
while (!salir) {
CrearSector0 (§or0, cmd);
if (!cmd.Silencioso) SonidoSube();
switch (result=FormatearDisco (§or0, &cmd, &bytes_err, &sg)) {
case 0: InformeDisco (§or0, bytes_err, sg);
if (!cmd.Silencioso) SonidoBaja(); break;
case 1: DiagnosticoError (result);
break;
default: DiagnosticoError (result);
if (!cmd.Silencioso) SonidoError(); break;
}
if (sp)
printf("\n Introduce otro disquete para formatear en");
else
printf("\n Please insert another disk to format in");
printf(" %c:", cmd.Unidad+'A');
if (!EsperarCambioDisco(cmd.Unidad)) salir=1;
}
printf("\r \r");
}
void ProcesarParametros(int argc, char **argv, struct parametros *cmd)
{
int pm, error=0, hlp=0, id=1;
cmd->Unidad=cmd->TipoFmt=cmd->ED=cmd->NoVerify=cmd->MarcaPoco=0;
cmd->HD=1; cmd->Pistas=82;
cmd->FichRaiz=cmd->Silencioso=cmd->NoPausa=0;
cmd->X=cmd->Y=cmd->G=-1;
for (pm=1; pm<argc; pm++) {
strupr (argv[pm]);
if (strstr(argv[pm],"/?")!=NULL) hlp++;
else if (strstr(argv[pm],"/H")!=NULL) hlp++;
else if ((strstr(argv[pm],"A:")!=NULL) ||
(strstr(argv[pm],"B:")!=NULL)) cmd->Unidad=*argv[pm]-'A';
else if (strstr(argv[pm],"/DD")!=NULL) cmd->HD=0;
else if (strstr(argv[pm],"/D0")!=NULL) cmd->HD=2;
else if (strstr(argv[pm],"/D1")!=NULL) cmd->HD=3;
else if (strstr(argv[pm],"/F")!=NULL) cmd->TipoFmt=0;
else if (strstr(argv[pm],"/M")!=NULL) cmd->TipoFmt=1;
else if (strstr(argv[pm],"/E")!=NULL) cmd->ED=1;
else if (strstr(argv[pm],"/N")!=NULL) cmd->NoVerify=1;
else if (strstr(argv[pm],"/W")!=NULL) cmd->MarcaPoco=1;
else if (strstr(argv[pm],"/T")!=NULL)
cmd->Pistas = atoi (&argv[pm][3]);
else if (strstr(argv[pm],"/R")!=NULL)
cmd->FichRaiz = atoi (&argv[pm][3]);
else if (strstr(argv[pm],"/S")!=NULL) { cmd->Silencioso=1; id++; }
else if (strstr(argv[pm],"/K")!=NULL) cmd->NoPausa=1;
else if (strstr(argv[pm],"/X")!=NULL) cmd->X=atoi(&argv[pm][3]);
else if (strstr(argv[pm],"/Y")!=NULL) cmd->Y=atoi(&argv[pm][3]);
else if (strstr(argv[pm],"/G")!=NULL) cmd->G=atoi(&argv[pm][3]);
else if (strstr(argv[pm],"/I")!=NULL) { sp^=1; id++; }
else error=1;
}
if (cmd->ED && (cmd->HD!=1)) cmd->HD=1; /* /DD ó /Dx + /E = /E */
if ((argc<=1) || (argc==id)) hlp++;
if (hlp) Ayuda();
if (sp)
printf("\n2MF 2.1 - Utilidad de formateo de disquetes 2M (ESC Salir)\n");
else
printf("\n2MF 2.1 - Format utility program for 2M diskettes (ESC Aborts)\n");
if (error) {
if (sp)
printf(" Error de sintaxis. E